约 2229 字

约 11 分钟

#SSH 远程

#简介

PowerShell 7 支持基于 SSH 的远程处理。与 WinRM 相比,SSH 传输天然跨平台,可以在 Windows、Linux 和 macOS 之间建立远程会话。使用 SSH 时,New-PSSession、Invoke-Command 和 Enter-PSSession 需要改用 -HostName 参数,而不是 Windows 上的 -ComputerName。

#前提条件

目标计算机需要满足:

  • 安装并运行 OpenSSH Server(sshd)。
  • 安装 PowerShell 7(pwsh)。
  • 在 SSH 配置中注册 PowerShell 子系统。

在 Linux 上,编辑 /etc/ssh/sshd_config,加入:

# /etc/ssh/sshd_config
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

在 Windows 上,配置文件通常位于 C:\ProgramData\ssh\sshd_config,子系统路径应指向 pwsh.exe 的完整路径。

修改后重启 SSH 服务。Linux 上常见命令:

$ sudo systemctl restart sshd

-sshs 表示以 SSH 子系统模式运行 PowerShell,-NoLogo 用于关闭启动徽标。客户端需要安装 OpenSSH 客户端,并能够通过密钥或密码登录目标计算机。

#创建 SSH 会话

使用 New-PSSession -HostName 建立 SSH 远程会话:

> $session = New-PSSession -HostName server01 -UserName alice

默认使用 22 端口;也可以指定端口或密钥:

> $session = New-PSSession -HostName server01 -UserName alice -Port 2222
> $session = New-PSSession -HostName server01 -UserName alice -KeyFilePath ~/.ssh/id_ed25519

未指定密钥时,PowerShell 会按照 SSH 的方式提示输入密码,或使用已加载到 ssh-agent 中的密钥。

#执行远程命令

使用 Invoke-Command -HostName 执行一次性远程命令:

> Invoke-Command -HostName server01 -UserName alice -ScriptBlock {
    Get-Date
    $PSVersionTable.PSVersion
}

复用已建立的会话:

> Invoke-Command -Session $session -ScriptBlock { hostname }

向脚本块传递参数:

> Invoke-Command -Session $session -ScriptBlock {
    param($Path)
    Get-ChildItem -Path $Path
} -ArgumentList '/var/log'

#交互式 SSH 会话

使用 Enter-PSSession -HostName 进入远程交互式会话:

> Enter-PSSession -HostName server01 -UserName alice

退出时执行:

[server01]: PS> Exit-PSSession

#注意事项

  • SSH 远程会话中的命令在目标计算机的登录用户权限下运行。
  • 推荐使用密钥认证,并妥善保护私钥文件权限。
  • Windows 目标机需要通过“可选功能”安装 OpenSSH Server。
  • 修改 sshd_config 后必须重启 SSH 服务,否则 PowerShell 子系统不会生效。
  • 如果连接失败,可先使用系统 ssh 客户端验证网络和登录是否正常。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2